package com.stu.reflection.access_private;
import java.lang.reflect.*;

public class TestPrivate {
  public static void main(String[] args) throws Exception {
    test(false);
    System.out.println("---------");
    test(true);
  }

  /**
   * 测试 是否解除封装 对 调用不同访问权限成员 的影响
   * @param flag 为true表示解除封装，否则表示不解除封装
   * @throws Exception
   */
  static void test(boolean flag) throws Exception {
    // 1、获取 Pojo 的 Class 对象
    Class<?> clazz = Pojo.class;
    // 2、创建一个 Pojo 实例，用于挂载非静态成员
    Object obj = clazz.newInstance();
    // 3、获取成员
    Field[] fields = clazz.getDeclaredFields();
    // 4、调用成员
    if(!flag){
      try {
        for (Field field : fields) {
          // 1）当未解除封装时，调用私有成员。结果报异常
          System.out.println(field.get(obj));
        }
      } catch (Exception e) {
        e.printStackTrace();
      }
    } else {
      // 解除封装 
      // field.setAccessible(true);//方式1
      AccessibleObject.setAccessible(fields, true);//方式2
      for (Field field : fields) {
        // 2）当解除封装后，调用私有成员。结果成功
        System.out.println(field.get(obj));
      }
    }
  }
}
